// ConsoleApplication7.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include<stdio.h>
#include<stdlib.h>

typedef struct
{
	double max;//最大数
	double min;//最小数
	double avg;//平均值
	double * att;//数组地址
} max_and_min;

int main()
{
	//声明
	void get_max_and_min(int);
	void get_longer_two();
	int get_two();
	void main_run_six();
	void main_run_seven();

	printf("进入作业六：\n");

	main_run_six();

	printf("进入作业七：\n");
	main_run_seven();

}


void main_run_seven() 
{
	void three_num_sort();
	void get_odd_and_even();

	printf("请输入题号选择：\n\
		程序1、要求用到指针和函数：输入3个整数a、b、c，按照从小到大的顺序输出\n\
		程序2、要求用到指针和函数：输入k个整数（均大于0），对其中的偶数和奇数进行统计并输出。\n");

	int num = 0;
	scanf("%d", &num);

	switch (num)
	{
	case 1:
		three_num_sort();
		break;
	case 2:
		get_odd_and_even();
		break;
	default:
		printf("无效题号输入！！！\n");
		main_run_seven();
		break;
	}
}
void three_num_sort()
{
	void att_sort(int *, int, int);

	printf("请输入三个数字!\n");
	int a, b, c;
	scanf("%d", &a);
	scanf("%d", &b);
	scanf("%d", &c);
	int att[] = { a, b, c };
	int att_length = 3;
	int flag = 1;
	att_sort(att,att_length ,flag);

	printf("排序后的数组\n");

	for (int x = 0; x < att_length; x++)
	{
		printf("第%d个数为：\t %d\n", x + 1, * (att + x + 1));
	}

	system("pause");
}
void att_sort(int *att, int att_length, int flag)
{
	//冒泡排序
	for (int x = 0; x < att_length; x++)
	{
		for (int y = 0; y < att_length - x; y++)
		{
			if (y == att_length - x) break;
			if (att[y] > att[y + 1]) 
			{
				//换位
				/*int *a = att[y];
				int *b = att[y + 1];*/
				att[y] = att[y + 1] - att[y];
				att[y + 1] = att[y + 1] - att[y];
				att[y] = att[y + 1] + att[y];
				/*a = b - a; 
				b = b - a; 
				a = b + a;*/
				/*att[y] ^= att[y + 1];
				att[y + 1] = att[y] ^ att[y + 1];
				att[y] ^= att[y + 1];*/
			}
		}
	}
}
void get_odd_and_even()
{
	printf("输入你想输入的数字个数！：\n");

	int num = 0;
	scanf("%d", &num);

	int *att = (int *)malloc(num * sizeof(int));
	int *att_obb = (int *)malloc(num * sizeof(int));
	int *att_even = (int *)malloc(num * sizeof(int));
	int obb_index = 0;
	int even_index = 0;
	if (att == NULL || att_obb == NULL || att_even == NULL)
	{
		fprintf(stderr, "Error - unable to allocate required memory\n");
	}
	else
	{
		for (int x = 0; x < num; x++)
		{
			printf("\n第%d个数输入：\n", x + 1);
			scanf("%d", att + x);
			printf("\n第%d个数为：\t %d\n", x + 1, *(att + x));
			if (*(att + x) % 2 == 0)
			{
				*(att_obb + obb_index ++) = *(att + x);
			}
			else
			{
				*(att_even + even_index ++) = *(att + x);
			}
		}

		printf("\n偶数：\t");
		for (int x = 0; x < obb_index; x++)
		{
			printf("%d\t", *(att_obb + x));
		}

		printf("\n奇数：\t");
		for (int x = 0; x < even_index; x++)
		{
			printf("%d\t", *(att_even + x));
		}

		printf("\n偶数：%d个\t奇数：%d个", obb_index, even_index);

		system("pause");
	}
	
	free(att);
	free(att_even);
	free(att_obb);

}
void main_run_six()
{
	
	printf("请输入题号选择：\n\t程序1、编写一个函数fun,具体功能如下：从键盘输入5个数，输出最大的数、最小的数、以及这5个数的平均值\
		\n\t程序2、编写一个函数fun, 具体功能如下：（不得调用C语言提供的求字符串长度的函数）fun函数具有比较两个字符串长度的作用，并返回较长的字符串，如果两个字符串长度一样，则返回第二个字符串\
		\n\t程序3、编写一个函数fun, 具体功能如下：找出10至n（n通过键盘输入，n大于10小于99）的所有两位数，要求这个两位数十位和个位之和为偶数。\n");

	int num = 0;
	scanf("%d", &num);

	switch (num)
	{
	case 1:
		get_max_and_min(5);
		break;
	case 2:
		get_longer_two();
		break;
	case 3:
		get_two();
		break;
	default:
		printf("无效题号输入！！！\n");
		main_run_six();
		break;
	}
}
void get_max_and_min(int count) {

	//函数声明
	max_and_min set_max_and_min(double *, int);
	//从键盘输入5个数
	//申请堆区空间，用数组存这五个数
	int att_length = count;
	max_and_min res;
	double *att = (double *)malloc(att_length * sizeof(double));
	if (att == NULL)
	{
		fprintf(stderr, "Error - unable to allocate required memory\n");
	}
	else
	{
		for (int x = 0; x < att_length; x++) {
			printf("请输入第%d个数\n", x + 1);
			scanf("%lf", att + x);
			printf("第%d个输入的数字为%lf\n\n", x + 1, att[x]);
			if (x == att_length - 1) {
				res = set_max_and_min(att, att_length);
			}
		}
	}
	/* 使用 free() 函数释放内存 */
	free(att);
}
max_and_min  set_max_and_min(double *att, int att_length)
{
	double max, min, sum;
	max = att[0];
	min = att[0];
	sum = 0;
	for (int x = 0; x < att_length; x++) {
		if (att[x] >= max) max = att[x];
		if (att[x] <= min) min = att[x];
		sum += att[x];
	}

	max_and_min result = {
		max,
		min,
		sum / att_length,
		att
	};

	printf("*************************\n");
	printf("最大的数是%lf\n", result.max);
	printf("最小的数是%lf\n", result.min);
	printf("平均数是%lf\n", result.avg);
	printf("*************************\n");

	return result;
}
void get_longer_two() {
	char * my_str_len_cmp(char *, char *);

	printf("请输入第一串字符串(不超过1024)\n");
	char *str1 = (char *)malloc(1024 * sizeof(char));
	if (str1 == NULL)
	{
		fprintf(stderr, "Error - unable to allocate required memory\n");
	}
	else
	{
		scanf("%s", str1);
	}


	printf("请输入第二串字符串(不超过1024)\n");
	char *str2 = (char *)malloc(1024 * sizeof(char));
	if (str2 == NULL)
	{
		fprintf(stderr, "Error - unable to allocate required memory\n");
	}
	else
	{
		scanf("%s", str2);
	}

	
	char * get_str = my_str_len_cmp(str1, str2);

	printf("\n长度较长的字符串是:%s\n", get_str);

	free(str1);
	free(str2);

}
char* my_str_len_cmp(char *str1, char *str2) {
	int my_str_len(char *);
	int str1_len = my_str_len(str1);
	int str2_len = my_str_len(str2);
	return str1_len > str2_len ? str1 : str2;
}
int my_str_len(char *str) {
	int num = 0;
	while (1) {
		if (*(str + num) == '\0')
		{
			return num;
		}
		num ++;
	}
}
int get_two() 
{
	printf("请输入一个大于10小于99的两位数\n");

	int num = 0;
	scanf("%d", &num);

	if (num < 10 || num > 99) 
	{
		printf("请输入合法数字\n");
	}
	else {
		int att_length = 0;
		for (int x = 0; x < 99; x++)
		{
			if (((x / 10) + (x % 10)) % 2 == 0)
			{
				att_length ++;
			}
		}

		int *att = (int *)malloc(att_length * sizeof(int));
		int index = 0;
		for (int x = 11; x < num; x++) 
		{
			if (((x / 10) + (x % 10)) % 2 == 0) 
			{
				printf("%d\n", x);
				att[index] = x;
				index ++;
			}
		}

		for (int x = 0; x < index; x++)
		{
			printf("第%d个符合要求的数是：%d\n\n", x + 1, att[x]);
			if (x == index - 1)
			{
				printf("总共有%d个数字:\t", index);
				for (int x = 0; x < index; x++)
				{
					printf("%d\t", att[x]);
				}
			}
		}
		system("pause");

		return 0;
	}

	get_two();
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门提示: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
